package serveur;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


public class AccepterConnexion implements Runnable {

	private ServerSocket socketserver;
	private Socket socket;
	private BufferedReader in;
	private DataOutputStream out;
	private String message;
	private int nbjoueurs;
	private int nbparties;
	private int numPartieCourante;
	private Partie [] parties;

	AccepterConnexion(ServerSocket _socketserver, 
			Partie[] parties) 
					throws IOException{
		this.socketserver = _socketserver;
		socket = null;
		nbjoueurs = 0;
		nbparties =0;
		this.parties= parties;
		numPartieCourante = 0;
	}

	@Override
	public synchronized void run() {
		try {
			while(true){
				//Connexion du client a la socket
				socket=socketserver.accept();

				System.out.println("Un joueur/client veut se connecter.");

				//creation flux entrant
				in = new BufferedReader(
						new InputStreamReader(
								socket.getInputStream()) );

				//lecture du flux entrant dans message
				message = in.readLine();

				System.out.println(
						socket.getRemoteSocketAddress()+
						" : "+message);

				out = new DataOutputStream(		
						socket.getOutputStream()
						);

				if (message.startsWith(Commande.CONNECT)){
					message = message.substring(0, message.length()-2);
					String[] tabChaines = message.split("/");
					String nom = tabChaines[1];

					//System.out.println("Nom du joueur : "+tabChaines[1]);

					out.write(Commande.WELCOME.getBytes());

					if(nbjoueurs <= 4){

						//si c'est le premier joueur
						if(nbjoueurs == 0){
							//on cree une nouvelle partie
							parties[nbparties] = new Partie(nbparties);
							nbparties++;
							numPartieCourante = nbparties -1;
						}

						boolean estDoublon = false;

						for(	int i=0; 
								i<parties[numPartieCourante].getNbjoueurs();
								i++){
							if( nom.equals(
									parties[numPartieCourante].joueurs[i])){
								
								out.write("pseudo doublon".getBytes());
								estDoublon = true;
								break;
							}
						}

						//On ajoute le joueur a la partie
						if(!estDoublon){
							if((parties[numPartieCourante]).ajoutJoueur(
									new Joueur(
											socket,in,out,nom, 
											numPartieCourante ) ) ) {
								//le joueur a bien été ajouté à la partie
								nbjoueurs++;
							} 
							else {
								//TODO : gerer les parties pleines
								for(int i = nbparties -1; i>=0; i--){
									numPartieCourante--;
									if (parties[i].isPleine()){
										break;
									}
									//Changement de partie
								}

							}

						}
						else{
							System.out.println("DOUBLON");
							out.writeBytes(Commande.ACCESSDENIED);
							in.close();
							out.close();
							socket.close();
						}
					}
				}
				else {
					out.write(Commande.ACCESSDENIED.getBytes());
					in.close();
					out.close();
					socket.close();
				}

			//TODO : gerer deconnexions intempestives	
			}
		} catch (IOException e) {
			System.err.println("Erreur serveur.");
		}
	}
}
